﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using LASGui.Classes;
using LASGui.MainService;

namespace LASGui.Views
{
    public partial class Home : Page
    {

        private readonly AuthenticatedUser _authenticatedUserManager;
        private readonly MainPage _mainPage;
        private List<Company> _companies;

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        public Home()
        {
            _authenticatedUserManager = AuthenticatedUser.Instance;
            InitializeComponent();
            GetCompanies();
            _mainPage = ((App)Application.Current).Mainpage;
            _mainPage.HideMainMenu();
            _authenticatedUserManager.OnlineUser = null;
        }

        #region Mouse events
        /// <summary>
        /// Evento de autenticación para iniciar sesión.
        /// </summary>
        private void AuthenticateUser(object sender, RoutedEventArgs e)
        {
            var usuario = InputUser.Text;
            var password = InputPassword.Password;
            var sociedad = InputSociedad.SelectedIndex;

            if (string.IsNullOrEmpty(usuario))
            {
                ChildWindow errorWindow = new CustomChildWindow("Debe ingresar todos los datos.", "Por favor ingrese su usuario.");
                errorWindow.Show();
            }
            else if (string.IsNullOrEmpty(password))
            {
                ChildWindow errorWindow = new CustomChildWindow("Debe ingresar todos los datos.", "Por favor ingrese su contraseña.");
                errorWindow.Show();
            }
            else if (sociedad == -1)
            {
                ChildWindow errorWindow = new CustomChildWindow("Debe ingresar todos los datos.", "Por favor seleccione su compañia");
                errorWindow.Show();
            }
            else
            {
                GetUser(MD5Core.GetHashString(usuario + password + (sociedad + 1)));
                InputUser.IsEnabled = false;
                InputPassword.IsEnabled = false;
                InputSociedad.IsEnabled = false;
            }

        }
        #endregion

        #region Webservice calls
        /// <summary>
        /// Metodo que permite obtener las empresas
        /// </summary>
        public void GetCompanies()
        {
            var client = new MainServiceSilverlightClient();
            client.GetCompaniesCompleted += ClientGetCompaniesCompleted;
            client.GetCompaniesAsync();
        }

        /// <summary>
        /// Método que permite obtener al usuario
        /// </summary>
        /// <param name="md5Value"></param>
        public void GetUser(string md5Value)
        {
            var client = new MainServiceSilverlightClient();
            client.GetUserCompleted += ClientGetUserCompleted;
            client.GetUserAsync(md5Value);
        }

        /// <summary>
        /// Método que permite obtener las monedas de la compañía
        /// </summary>
        /// <param name="companyId"></param>
        public void GetCompanyCurrency(int companyId)
        {
            var client = new MainServiceSilverlightClient();
            client.GetCompanyCurrenciesCompleted += ClientGetCompanyCurrenciesCompleted;
            client.GetCompanyCurrenciesAsync(companyId);
        }

        /// <summary>
        /// Método que permite obtener el catálogo de la cuenta
        /// </summary>
        /// <param name="companyId"></param>
        public void GetAccountCatalog(int companyId)
        {
            var client = new MainServiceSilverlightClient();
            client.GetAccountingCatalogCompleted += ClientGetAccountingCatalogCompleted;
            client.GetAccountingCatalogAsync(companyId);
        }

        /// <summary>
        /// Método que permite obtener las monedas del sistema.
        /// </summary>
        /// <param name="companyId"></param>
        public void GetCurrency(int companyId)
        {
            var client = new MainServiceSilverlightClient();
            client.GetCurrenciesCompleted += ClientGetCurrenciesCompleted;
            client.GetCurrenciesAsync();
        }
        #endregion

        #region Webservice completeness events for asynchronous calls
        /// <summary>
        /// Evento para la llamada de compañias.
        /// </summary>
        private void ClientGetCompaniesCompleted(object sender, GetCompaniesCompletedEventArgs e)
        {
            if (e.Result == null)
            {
                ChildWindow errorWindow = new CustomChildWindow("Error de Conexión", "Por favor intente más tarde");
                errorWindow.Show();
            }
            else
            {
                InputSociedad.ItemsSource = e.Result.Select(empresa => empresa.CompanyName).ToList();
                _companies = e.Result.ToList();
            }
        }

        /// <summary>
        /// Evento para la llamada de usuario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ClientGetUserCompleted(object sender, GetUserCompletedEventArgs e)
        {
            try
            {
                if (e.Error != null)
                {
                    ChildWindow errorWindow = new CustomChildWindow(e.Error);
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;

                }
                if (e.Result == null)
                {
                    ChildWindow errorWindow = new CustomChildWindow("Error de login", "El usuario no se encuentra en el sistema o la información que ha proporcionado es incorrecta.");
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                }
                else
                {
                    _authenticatedUserManager.OnlineUser = e.Result;
                    _authenticatedUserManager.OnlineUser.Company = _companies[InputSociedad.SelectedIndex];

                    GetAccountCatalog(_authenticatedUserManager.OnlineUser.Company.CompanyId);
                }
            }
            catch (Exception)
            {
                ChildWindow errorWindow = new CustomChildWindow(e.Error);
                errorWindow.Show();
            }
        }

        /// <summary>
        /// Evento para la llamada del catalogo de cuenta.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ClientGetAccountingCatalogCompleted(object sender, GetAccountingCatalogCompletedEventArgs e)
        {
            try
            {
                if (e.Error != null)
                {
                    ChildWindow errorWindow = new CustomChildWindow(e.Error);
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                if (e.Result == null)
                {
                    ChildWindow errorWindow = new CustomChildWindow("Error de login", "El servicio no se encuentra disponible en este momento por favor intentelo más tarde.");
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                else
                {
                    _authenticatedUserManager.OnlineUser.Company.AccountCatalog = e.Result;
                    GetCompanyCurrency(_authenticatedUserManager.OnlineUser.CompanyId);
                }
            }
            catch (Exception)
            {
                ChildWindow errorWindow = new CustomChildWindow(e.Error);
                errorWindow.Show();
            }
        }

        /// <summary>
        /// Evento para la llamada de monedas de la compañia
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ClientGetCompanyCurrenciesCompleted(object sender, GetCompanyCurrenciesCompletedEventArgs e)
        {
            try
            {
                if (e.Error != null)
                {
                    ChildWindow errorWindow = new CustomChildWindow(e.Error);
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                if (e.Result == null)
                {
                    ChildWindow errorWindow = new CustomChildWindow("Error de login", "El servicio no se encuentra disponible en este momento por favor intentelo más tarde.");
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                else
                {
                    _authenticatedUserManager.OnlineUser.Company.LocalCurrency = e.Result[1];
                    _authenticatedUserManager.OnlineUser.Company.SystemCurrency = e.Result[0];
                    GetCurrency(_authenticatedUserManager.OnlineUser.CompanyId);
                }
            }
            catch (Exception)
            {
                ChildWindow errorWindow = new CustomChildWindow(e.Error);
                errorWindow.Show();
            }
        }

        /// <summary>
        /// Evento para la llamada de monedas.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ClientGetCurrenciesCompleted(object sender, GetCurrenciesCompletedEventArgs e)
        {
            try
            {
                if (e.Error != null)
                {
                    ChildWindow errorWindow = new CustomChildWindow(e.Error);
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                if (e.Result == null)
                {
                    ChildWindow errorWindow = new CustomChildWindow("Error de login", "El servicio no se encuentra disponible en este momento por favor intentelo más tarde.");
                    errorWindow.Show();
                    InputUser.IsEnabled = true;
                    InputPassword.IsEnabled = true;
                    InputSociedad.IsEnabled = true;

                    InputUser.Text = "";
                    InputPassword.Password = "";
                    InputSociedad.SelectedIndex = 0;
                    _authenticatedUserManager.OnlineUser = null;
                }
                else
                {
                    if (InputUser.Text == "admin")
                    {
                        _authenticatedUserManager.CompanyCurrency = e.Result.ToList();
                        NavigationService.Navigate(new Uri("/RegistroEmpresa", UriKind.Relative));
                    }
                    else
                    {
                        _authenticatedUserManager.CompanyCurrency = e.Result.ToList();
                        NavigationService.Navigate(new Uri("/Cuentas", UriKind.Relative));
                        _mainPage.ShowMainMenu();
                    }
                }
            }
            catch (Exception)
            {
                ChildWindow errorWindow = new CustomChildWindow(e.Error);
                errorWindow.Show();
            }
        }
        #endregion
    }
}
